from queue import PriorityQueue

class Priority():
    
    def __init__(self):
        self.qReady = PriorityQueue() # crea una cola con prioridad
        self.cantBusts = 6 # cada 6 bursts del CPU que 1 pcb estubo en la QReady se envejece en 1 
        
    def getProcess(self):
        return self.qReady._get()[1]#dado que devuelve una tupla, quiero el segundo elemento
    
    def agregarElemetoQReady(self, pcb):
        self.qReady._put([pcb.getPrioridad(), pcb]) # prog debe una tupla de form[prioridad, prog]
        
    def getQReady(self):
        return self.qReady 
        
    def instruccionEjecutada(self,kernel):
        self.envejecerQready()
        
    def getProgramaMenosUso(self):
        queueVieja = self.getQReady()
        listaAux = []
        queueResultado = PriorityQueue()
        while not queueVieja.empty():
            valor = queueVieja._get()[1]
            listaAux.append(valor)
            queueResultado._put([valor.getPrioridad(), valor])

        listaAux.reverse()
        self.qReady = queueResultado

        return self.chequeoDelProgMenosUtil(listaAux)
    
    def chequeoDelProgMenosUtil(self, listPcb):
        index = 0
        while True:
            pcb = listPcb[index]
            if not pcb.getEstaEnDisco():
                pcb.setEstaEnDisco(True)
                return pcb.getIdProgr()
            index+=index
        
    
    
    def envejecerQready(self):
        #recorreria los PCBs para incrementaria en 1 la cantidad de bust q estubieron dentro de la QReady
        #y los q llegaron al maximo (seteado con 6) envejecen restando en 1 la prioridad.

        qReadyVieja = self.getQReady()
        qreadyNueva = PriorityQueue()
        
        while not qReadyVieja.is_empty(): 
            # como es PriorityQueue el orden es por prioridad y los ordena automaticamente.
            qreadyNueva.put(qReadyVieja._get().envejece(self.cantBusts))
            
        self.qReady = qreadyNueva #se actualiza la qReady
